﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BLLTZS.Funcionalidad
{
    public class BLLUsuario: BLLGenerico
    {
        public BLLUsuario(TZSDataContext contexto) : base(contexto) { }
        public BLLUsuario() : this(new TZSDataContext()) { }

        public TZS_Usuario TraerUsuario(string nombreUsuario)
        {
            return Contexto.TZS_Usuarios.Where(u => u.NombreUsuario.ToLower().Equals(nombreUsuario.ToLower())).FirstOrDefault();
        }

        public TZS_Usuario TraerUsuario(int idUsuario)
        {
            return Contexto.TZS_Usuarios.Where(u => u.IdUsuario == idUsuario).FirstOrDefault();
        }

        public bool ValidarLogin(string nombreUsuario, string contraseña)
        {
            TZS_Usuario usuario = TraerUsuario(nombreUsuario);

            if (usuario == null || !usuario.Habilitado)
                return false;
            else
            {
                string contraseñaDesencriptada = Encriptador.Desencriptar(usuario.Contraseña);
                return contraseña.Equals(contraseñaDesencriptada);
            }
        }

        public bool Existe(string nombreUsuario)
        {
            return Contexto.TZS_Usuarios.Where(u => u.NombreUsuario.ToLower().Equals(nombreUsuario.ToLower())).Count() > 0;
        }

        public void CargarNuevo(TZS_Usuario nuevoUsuario)
        {
            BLLRol bllRol = new BLLRol(Contexto);
            BLLUsuarioRol bllUsuarioRol = new BLLUsuarioRol(Contexto);
            BLLHistorialContraseña bllHistorial = new BLLHistorialContraseña(Contexto);
            BLLPerfil bllPerfil = new BLLPerfil(Contexto);
            BLLDomicilio bllDomicilio = new BLLDomicilio(Contexto);
            BLLContacto bllContacto = new BLLContacto(Contexto);

            nuevoUsuario.Contraseña = Encriptador.Encriptar(nuevoUsuario.Contraseña);
            nuevoUsuario.Habilitado = true;
            Contexto.TZS_Usuarios.InsertOnSubmit(nuevoUsuario);

            TZS_Perfil perfil = bllPerfil.CrearNuevo(nuevoUsuario);
            bllDomicilio.CrearNuevo(perfil);
            bllContacto.CrearNuevo(perfil);

            foreach (TZS_Rol rol in bllRol.TraerRolesPorDefecto())
                bllUsuarioRol.Asignar(nuevoUsuario, rol);

            bllHistorial.AgregarRegistro(nuevoUsuario, nuevoUsuario.Contraseña);
        }

        public void ActualizarContraseña(string nombreUsuario, string nuevaContraseña)
        {
            TZS_Usuario usuario = TraerUsuario(nombreUsuario);
            usuario.Contraseña = Encriptador.Encriptar(nuevaContraseña);

            //BLLHistorialContraseña bllHistorial = new BLLHistorialContraseña(Contexto);
            //bllHistorial.AgregarRegistro(usuario, nuevaContraseña);
        }

        public string TraerD(string dolina)
        {
            TZS_Usuario usuario = TraerUsuario(dolina);
            return Encriptador.Desencriptar(usuario.Contraseña);
        }

        public List<TZS_Usuario> BuscarUsuarios(string nombreUsuario, string nombres, string apellidos)
        {
            if (nombreUsuario == null)
                nombreUsuario = string.Empty;
            if (nombres == null)
                nombres = string.Empty;
            if (apellidos == null)
                apellidos = string.Empty;

            return (from u in Contexto.TZS_Perfils
                    where (nombreUsuario == string.Empty || u.TZS_Usuario.NombreUsuario.ToLower().Contains(nombreUsuario.ToLower()))
                    && (nombres == string.Empty || u.Nombres.ToLower().Contains(nombres.ToLower()))
                    && (apellidos == string.Empty || u.Apellidos.ToLower().Contains(apellidos.ToLower()))
                    orderby u.TZS_Usuario.NombreUsuario
                    select u.TZS_Usuario).Distinct().ToList();
        }

        public List<TZS_Usuario> TraerUsuariosConDNI()
        {
            return (from u in Contexto.TZS_Usuarios
                    where u.TZS_Perfils.OrderByDescending(p => p.IdPerfil).FirstOrDefault().ArchivoDNI != null && u.TZS_Perfils.OrderByDescending(p => p.IdPerfil).FirstOrDefault().ArchivoDNI2 != null
                    && u.TZS_DocumentoProcesados.Count == 0
                    orderby u.IdUsuario descending
                    select u).ToList();
        }

        public static string GenerarContraseñaAleatoria()
        {
            string contraseña = string.Empty;
            Random ran = new Random();

            for (int i = 0; i < 6; i++)
                contraseña += ran.Next(0, 9).ToString();

            return contraseña;
        }
    }
}
